package com.study.lambda;

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

/**
 * @author yangyb
 * <p>
 * Lambda 表达式的使用
 * 1、eg:(o1,o2) -> Integer.compare(o1,o2);
 * <p>
 * 2、格式：
 * -> :lambda操作符 或者箭头操作符
 * -> 左边：lambda 形参列表（其实就是接口中的抽象方法的形参列表）
 * -> 右边：lambda 体（其实就是重写的抽象方法的方法体）
 * <p>
 * 3、lambda 表达式的使用（分为6中情况）
 * <p>
 * 4、lambda 表达式的本质：接口的实例化
 * <p>
 * 总结：
 * -> 左边：labda形参列表的参数类型可以省略（类型推断）；如果lambda形参列表只有一个参数，其中一对（）也可以省略
 * -> 右边：lambda 体应该使用一对{}包裹;如果lambdm体只有一条执行语句（可是return语句）可以省略这一对{}和return关键字
 */

public class LambdaTest1 {
    /**
     * 语法格式一：无参，无返回值
     */
    @Test
    public void test1() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("你好！lambda表达式");
            }
        };
        runnable.run();

        System.out.println("********************");

        Runnable runnable1 = () -> System.out.println("你好！lambda表达式");
        runnable1.run();

    }

    /**
     * 语法格式二：有一个参数，无返回值
     */
    @Test
    public void test2() {
        Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String str) {
                System.out.println(str);
            }
        };
        consumer.accept("你好！consumer");
        System.out.println("********************");

        Consumer<String> consumer1 = (String s) -> {
            System.out.println(s);
        };
        consumer1.accept("你好！consumer!!");

    }

    /**
     * 语法格式三：数据类型可以省略，因为可由编译器退断出，称为"类型推断"
     */
    @Test
    public void test3() {
        Consumer<String> consumer1 = (String s) -> {
            System.out.println(s);
        };
        consumer1.accept("你好！consumer!!");
        System.out.println("********************");
        Consumer<String> consumer2 = (s) -> {
            System.out.println(s);
        };
        consumer1.accept("你好！consumer!!");

    }

    /**
     * 语法格式四：Lambda 若只需要一个参数时，参数的小括号可以省略
     */
    @Test
    public void test4() {
        Consumer<String> consumer3 = (s) -> {
            System.out.println(s);
        };
        consumer3.accept("你好！consumer!!");

        System.out.println("********************");
        Consumer<String> consumer4 = s -> {
            System.out.println(s);
        };
        consumer3.accept("你好！consumer!!");
    }

    /**
     * 语法格式五：Lambda 若需要两个参数或两个以上时，多条执行语句，并且可以有返回值
     */
    @Test
    public void test5() {
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println(comparator.compare(12, 45));

        System.out.println("*************");

        Comparator<Integer> comparator1 = (o1, o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(comparator1.compare(1266, 450000));

    }

    /**
     * 语法格式六：当Lambda 体只有一条语句时，return 与大括号若有，都可以省略
     */
    @Test
    public void test7() {
        Comparator<Integer> comparator2 = (o1, o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(comparator2.compare(1266, 450000));
        System.out.println("*************");
        Comparator<Integer> comparator3 = (o1, o2) -> o1.compareTo(o2);


        Consumer<String> consumer3 = (s) -> System.out.println(s);

    }


}
